<?php


namespace app\model;


use think\Model;
use think\model\concern\SoftDelete;

class User extends Model
{
    protected $connection = 'mysql' ;  //选择数据库 默认可省
    protected $name = 'user';         //添加后缀，需要设计模型名称
    protected $pk = 'id';            //设置主键
    protected $table = 'tp_user';     //设置表
    protected $strict = true;       //模型是否严格区分大小写（并非肆无忌惮的不严格，只能首字母大写）


    //设置只读字段 即修改数据是无法修改  只读字段只支持模型不支持数据库方式
    protected $readonly = ['id','username'];
    //动态设置
    //$user->readonly(['username'])->save();



    //设置字段信息(直接使用字段缓存文件就可以)
//    protected $schema = [
//        'id'=>'int'
//    ];

    //对某个模型设置独立时间戳
    //自动时间戳开启后，会自动写入create_time update_time 两个字段

//    protected $autoWriteTimestamp = true;
//默认时间戳类型是int 如果是时间类型，更改如下
     protected $autoWriteTimestamp = 'datetime';
   //自定义新增和修改的时间戳
//    protected $createTime = 'create_at';
//    protected $updateTime = 'update_at';
//    protected $updateTime = false;

// 也可以动态实现不修改updataTime
//$user->isAutoWriteTimestamp(false)->save()


     //类型转换
     protected $type = [
         'status'=>'boolean',
         'price'=>'float',
         'create_time'=>'datetime:Y-m-d'
     ];

     //设置废弃字段
//    protected $disuse = ['status'];

    //设置json字段
    protected $json = ['list'];

    //开启软删除 并设置软删除标志字段
    use SoftDelete;
    protected $deleteTime = 'delete_time';  //默认是这个
    //delete_time默认我们设置是null 如果你想要更改这个默认值，可以设置
//    protected $defaultSoftDelete = 0

    //初始化操作
    protected static function init()
    {
        parent::init(); // TODO: Change the autogenerated stub
//        echo '初始化操作';
    }


    //设置status修改器
    public function getStatusAttr($value,$data){
        $arr = [
            0=>'禁用',
            -1=>'删除',
            1=>'正常',
            2=>'待审核',
            -3=>'垃圾',
            3=>'垃圾'
        ];
        return $arr[$value];
    }

    //设置一个虚拟nothing字段的修改器
    public function getNothingAttr($value,$data){
        $arr = [
            0=>'禁用',
            -1=>'删除',
            1=>'正常',
            2=>'待审核',
            -3=>'垃圾',
            3=>'垃圾'
        ];
        return $arr[$data['status']];
    }

    //email修改器
    //新增，修改数据都会调用修改器
    //模型修改器只对模型方法有效，调用数据库方法是无效的
    public function setEmailAttr($value){
        return strtoupper($value);
    }


    //强制全局查询条件，任何查询都必须加上这个条件
//    protected $globalScope = ['status'];
    public function scopeStatus($query){
        $query->where('status',1);
    }
    //模型范围  男 5 条
    public function scopeMale($query){
        $query->where('gender','男')->field('id,username,gender,email')->limit(5);
    }
    //模型范围
    public function scopeEmail($query,$value){
        $query->where('email','like','%'.$value.'%');
    }
    public function scopePrice($query,$value){
        $query->where('price','>',$value);
    }

    //搜索器
    public function searchEmailAttr($query,$value,$data){
//        dump($value);
//        dump($data);
        $query->where('email','like','%'.$value.'%');
        if(isset($data['sort'])){
            $query->order($data['sort']);
        }
    }
    public function searchCreateTimeAttr($query,$value,$data){
        $query->whereBetweenTime('create_time',$value[0],$value[1]);
    }

     //模型事件  模型支持事件很多，具体可以去手册看
//    protected static function onAfterRead(){
//        echo "一条数据被查询";
//    }

    //关联表 一对一
    public function profile(){
        //hasOne 表示 一对一 关联  参数一表示附表  参数二外键 默认 user_id
        //关联方式 有 9种 具体看文档
        //hasOne('关联模型','外键','主键')
        return $this->hasOne(Profile::class,'user_id');
    }

    //关联表 一对多
    public function book(){
        return $this->hasMany(Book::class);
    }

    //关联表多对多关联
    public function roles(){
        //belongsToMany('关联模型','中间表','外键'，'关联建')
        return $this->belongsToMany(Role::class,Access::class);
    }
}